﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class PedidosCompraForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int PedidoCompraId
        {
            get { return ViewState["PedidoCompraId"] == null ? -1 : (int)ViewState["PedidoCompraId"]; }
            set { ViewState["PedidoCompraId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Estilo Seleccionado
        /// </summary>
        private int EstiloId
        {
            get { return Session["EstiloId"] == null ? -1 : (int)Session["EstiloId"]; }
            set { Session["EstiloId"] = value; }
        }

        /// <summary>
        /// Es el código del Color Seleccionado
        /// </summary>
        private int ColorId
        {
            get { return Session["ColorId"] == null ? -1 : (int)Session["ColorId"]; }
            set { Session["ColorId"] = value; }
        }

        /// <summary>
        /// Es el código del Talla Seleccionado
        /// </summary>
        private int TallaId
        {
            get { return Session["TallaId"] == null ? -1 : (int)Session["TallaId"]; }
            set { Session["TallaId"] = value; }
        }       

        /// <summary>
        /// Listado de estilos.
        /// </summary>
        private List<CO_PedidoEstilo> EstilosTemp
        {
            get
            {
                return Session["EstilosTemp"] == null ? null : (List<CO_PedidoEstilo>)Session["EstilosTemp"];
            }
            set
            {
                Session["EstilosTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de colores.
        /// </summary>
        private List<CO_PedidoColor> ColoresTemp
        {
            get
            {
                return Session["ColoresTemp"] == null ? null : (List<CO_PedidoColor>)Session["ColoresTemp"];
            }
            set
            {
                Session["ColoresTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de tallas.
        /// </summary>
        private List<CO_PedidoTalla> TallasTemp
        {
            get
            {
                return Session["TallasTemp"] == null ? null : (List<CO_PedidoTalla>)Session["TallasTemp"];
            }
            set
            {
                Session["TallasTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            estiloAdd.agregarClick += new EventHandler(agregarEstilo_Click);
            combinacionAdd.agregarClick += new EventHandler(agregarColor_Click);
            estiloTallaAdd.agregarClick += new EventHandler(agregarTalla_Click); 
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;
          
            try
            {
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Comercial, (int)MenuComercial.PedidosCompra);
                    Master.AgregarBreadcrumb("Pedidos de Compra", "#", true);
                    Master.AgregarBreadcrumb("Listado", "PedidosCompraList.aspx", false);                            

                    int PedComId = 0;

                    if (Request.QueryString["PedidoCompraId"] != null && Int32.TryParse(Request.QueryString["PedidoCompraId"], out PedComId))
                    {
                        this.PedidoCompraId = PedComId;
                    }
                    else
                    {
                        this.PedidoCompraId = -1;
                    }

                    EstilosTemp = new List<CO_PedidoEstilo>();
                    ColoresTemp = new List<CO_PedidoColor>();
                    TallasTemp = new List<CO_PedidoTalla>();     

                    EstablecerComportamiento();
                    CargarMonedas();                                  
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;                        
                        Master.AgregarBreadcrumb("Consultar", "#", false);
                        CargarPedido();
                        DeshabilitarControles();
                        btnGrabar.Visible = false;
                        break;
                    case (int)AccionesForm.Modificar:
                        this.Operacion = AccionesForm.Modificar;                       
                        Master.AgregarBreadcrumb("Modificar", "#", false);
                        CargarPedido();
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;                       
                        Master.AgregarBreadcrumb("Adicionar", "#", false);
                        txtFechaRegistro.Text = DateTime.Now.ToShortDateString();
                        CargarEstilos();
                        CargarColores();
                        CargarTallas();
                        break;
                }
            }
        }

        private void CargarPedido()
        {
            TablasDataContext database = new TablasDataContext();

            var pedido = database.CO_PedidoCompra.FirstOrDefault(c => c.PedCom_Id == this.PedidoCompraId);

            txtNroPedido.Text = (pedido.PedCom_Id).ToString("00000");
            txtFechaRegistro.Text = pedido.PedCom_FechaRegistro.Value.ToShortDateString();
            txtFechaComercial.Text = pedido.PedCom_FechaComercial.Value.ToShortDateString();
            txtFechaEntrega.Text = pedido.PedCom_FechaEntrega.Value.ToShortDateString();
            txtEstado.Text = pedido.PedCom_Estado == 'R' ? "REGISTRADO" : "OPERATIVO";
            clienteSearch.CodigoSeleccionado = pedido.Cliente_Id;
            clienteSearch.NombreSeleccionado = pedido.TG_Cliente.Nombre;
            temporadaSearch.CodigoSeleccionado = pedido.Temporada_Id;
            temporadaSearch.DescripcionSeleccionado = pedido.TG_Temporada.Descripcion;            
            CargarDireccion();
            ddlDireccion.SelectedValue = pedido.CliDir_Id.ToString();
            estiloAdd.TemporadaId = pedido.Temporada_Id;
            
            ListarEstilos();
            if (EstilosTemp.Count > 0) this.EstiloId = EstilosTemp[0].Estilo_Id;
            ListarColores();
            if (ColoresTemp.Count > 0) this.ColorId = ColoresTemp.FindAll(c => c.Estilo_Id == this.EstiloId)[0].Combinacion_Id;
            ListarTallas();
            if (TallasTemp.Count > 0) this.TallaId = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId)[0].Talla_Id;

            combinacionAdd.EstiloId = this.EstiloId;
            estiloTallaAdd.EstiloId = this.EstiloId;

            CargarEstilos();
            CargarColores();
            CargarTallas();
        }

        private void DeshabilitarControles()
        {
            txtFechaComercial.Enabled = false;
            imgFechaComercial.Visible = false;
            txtFechaEntrega.Enabled = false;
            imgFechaEntrega.Visible = false;
            ddlDireccion.Enabled = false;
            clienteSearch.EnabledTextBox = false;
            temporadaSearch.EnabledTextBox = false;
            ddlMoneda.Enabled = false;

            btnEstiloAdicionar.Visible = false;
            btnEstiloEliminar.Visible = false;
            btnColorAdicionar.Visible = false;
            btnColorEliminar.Visible = false;
            btnTallaAgregar.Visible = false;
            btnTallaEliminar.Visible = false;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();                
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("PedidosCompraList.aspx");
        }   

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                case AccionesForm.Modificar:
                    Actualizar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Insertar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();
                database.DeferredLoadingEnabled = false;

                //Cargar Cabecera.
                CO_PedidoCompra pedido = new CO_PedidoCompra();
                pedido.Cliente_Id = clienteSearch.CodigoSeleccionado;
                pedido.Moneda_Id = Convert.ToInt32(ddlMoneda.SelectedValue);
                pedido.PedCom_Estado = 'R';
                pedido.PedCom_FechaComercial = Convert.ToDateTime(txtFechaComercial.Text);
                pedido.PedCom_FechaEntrega = Convert.ToDateTime(txtFechaEntrega.Text);
                pedido.PedCom_FechaRegistro = DateTime.Now.Date;
                pedido.Temporada_Id = temporadaSearch.CodigoSeleccionado;

                pedido.CO_PedidoEstilo = new EntitySet<CO_PedidoEstilo>();
                
                //Se carga el detalle.
                foreach (var estilo in EstilosTemp)
                {
                    CO_PedidoEstilo nuevoEstilo = new CO_PedidoEstilo()
                    {
                        Estilo_Id = estilo.Estilo_Id,
                        PedEst_CodigoCliente = estilo.PedEst_CodigoCliente,
                    };
                    pedido.CO_PedidoEstilo.Add(nuevoEstilo);

                    foreach (var color in ColoresTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id))
                    {
                        CO_PedidoColor nuevoColor = new CO_PedidoColor
                        {
                            Combinacion_Id = color.Combinacion_Id,
                            Estilo_Id = color.Estilo_Id,
                            PedCol_CodigoCliente = color.PedCol_CodigoCliente,
                            PedCol_Precio = color.PedCol_Precio
                        };                       

                        foreach (var talla in TallasTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id && c.Combinacion_Id == color.Combinacion_Id))
                        {
                            CO_PedidoTalla nuevoTalla = new CO_PedidoTalla
                            {
                                Combinacion_Id = talla.Combinacion_Id,
                                Estilo_Id = talla.Estilo_Id,
                                PedTal_CantidadProducida = talla.PedTal_CantidadProducida,
                                PedTal_CantidadSolicitada = talla.PedTal_CantidadSolicitada,
                                PedTal_Precio = talla.PedTal_Precio,
                                Talla_Id = talla.Talla_Id
                            };
                            nuevoColor.CO_PedidoTalla.Add(nuevoTalla);
                        }

                        nuevoEstilo.CO_PedidoColor.Add(nuevoColor);
                    }                   
                }

                database.CO_PedidoCompra.InsertOnSubmit(pedido);
                database.SubmitChanges();
                Response.Redirect("PedidosCompraList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void Actualizar()
        {
            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                TablasDataContext database = new TablasDataContext();
                database.DeferredLoadingEnabled = false;

                //Cargar Cabecera.
                CO_PedidoCompra pedido = database.CO_PedidoCompra.FirstOrDefault(c => c.PedCom_Id == this.PedidoCompraId);

                pedido.Cliente_Id = clienteSearch.CodigoSeleccionado;
                pedido.Moneda_Id = Convert.ToInt32(ddlMoneda.SelectedValue);
                pedido.PedCom_Estado = 'R';
                pedido.PedCom_FechaComercial = Convert.ToDateTime(txtFechaComercial.Text);
                pedido.PedCom_FechaEntrega = Convert.ToDateTime(txtFechaEntrega.Text);
                pedido.PedCom_FechaRegistro = DateTime.Now.Date;
                pedido.Temporada_Id = temporadaSearch.CodigoSeleccionado;

                pedido.CO_PedidoEstilo = new EntitySet<CO_PedidoEstilo>();

                //Se elimina el anterior detalle
                var tallas = (from pedidoTallas in database.CO_PedidoTalla
                                where pedidoTallas.CO_PedidoColor.PedCom_Id == this.PedidoCompraId
                                select pedidoTallas);

                foreach (var item in tallas)
                {
                    database.CO_PedidoTalla.DeleteOnSubmit(item); 
                }

                var colores = (from pedidoColores in database.CO_PedidoColor
                               where pedidoColores.PedCom_Id == this.PedidoCompraId
                               select pedidoColores);

                foreach (var item in colores)
                {
                    database.CO_PedidoColor.DeleteOnSubmit(item);
                }

                var estilos = (from pedidoEstilos in database.CO_PedidoEstilo
                               where pedidoEstilos.PedCom_Id == this.PedidoCompraId
                               select pedidoEstilos);

                foreach (var item in estilos)
                {
                    database.CO_PedidoEstilo.DeleteOnSubmit(item);
                }   

                //Se carga el detalle.
                foreach (var estilo in EstilosTemp)
                {
                    CO_PedidoEstilo nuevoEstilo = new CO_PedidoEstilo()
                    {
                        Estilo_Id = estilo.Estilo_Id,
                        PedEst_CodigoCliente = estilo.PedEst_CodigoCliente,
                    };
                    pedido.CO_PedidoEstilo.Add(nuevoEstilo);

                    foreach (var color in ColoresTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id))
                    {
                        CO_PedidoColor nuevoColor = new CO_PedidoColor
                        {
                            Combinacion_Id = color.Combinacion_Id,
                            Estilo_Id = color.Estilo_Id,
                            PedCol_CodigoCliente = color.PedCol_CodigoCliente,
                            PedCol_Precio = color.PedCol_Precio
                        };

                        foreach (var talla in TallasTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id && c.Combinacion_Id == color.Combinacion_Id))
                        {
                            CO_PedidoTalla nuevoTalla = new CO_PedidoTalla
                            {
                                Combinacion_Id = talla.Combinacion_Id,
                                Estilo_Id = talla.Estilo_Id,
                                PedTal_CantidadProducida = talla.PedTal_CantidadProducida,
                                PedTal_CantidadSolicitada = talla.PedTal_CantidadSolicitada,
                                PedTal_Precio = talla.PedTal_Precio,
                                Talla_Id = talla.Talla_Id
                            };
                            nuevoColor.CO_PedidoTalla.Add(nuevoTalla);
                        }

                        nuevoEstilo.CO_PedidoColor.Add(nuevoColor);
                    }
                }               
                database.SubmitChanges();
                Response.Redirect("PedidosCompraList.aspx");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private string ValidaDatos()
        {
            if (EstilosTemp.Count == 0)
            {
                return "No existen Estilos ingresadas.";
            }

            foreach (var estilo in EstilosTemp)
            {
                if(string.IsNullOrEmpty(estilo.PedEst_CodigoCliente))
                {
                    return "Estilo[" + estilo.DE_Estilo.Descripcion + "] no tiene Codigo de Cliente ingresado.";
                }

                var colores = ColoresTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id);
                if (colores.Count == 0)
                {
                    return "Estilo[" + estilo.DE_Estilo.Descripcion + "] no tiene Colores ingresadas.";
                }                

                foreach (var color in colores)
                {
                    if (string.IsNullOrEmpty(color.PedCol_CodigoCliente))
                    {
                        return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] no tiene Codigo de Cliente ingresado.";
                    }
                    if (color.PedCol_Precio == null)
                    {
                        return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color:[" + color.TG_Combinacion.Combinacion_Descripcion + "] no tiene Precio ingresado.";
                    }

                    var tallas = TallasTemp.FindAll(c => c.Estilo_Id == estilo.Estilo_Id && c.Combinacion_Id == color.Combinacion_Id);
                    if (tallas.Count == 0)
                    {
                        return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color:[" + color.TG_Combinacion.Combinacion_Descripcion + "] no tiene Tallas ingresadas.";
                    }

                    foreach (var talla in tallas)
                    {
                        if (talla.PedTal_CantidadProducida == null)
                        {
                            return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] - Talla[" + talla.TG_Talla.Talla_DescripcionCorta + "] no tiene Cantidad Producida ingresado.";
                        }
                        if (talla.PedTal_CantidadSolicitada == null)
                        {
                            return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] - Talla[" + talla.TG_Talla.Talla_DescripcionCorta + "] no tiene Cantidad Solicitada ingresado.";
                        }
                        if (talla.PedTal_Precio == null)
                        {
                            return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] - Talla[" + talla.TG_Talla.Talla_DescripcionCorta + "] no tiene Precio ingresado.";
                        }


                        if (talla.PedTal_CantidadSolicitada > talla.PedTal_CantidadProducida)
                        {
                            return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] - Talla[" + talla.TG_Talla.Talla_DescripcionCorta + "] Cantidad Solicitada es mayor a la Producida.";
                        }
                        if (talla.PedTal_CantidadSolicitada * 1.1 < talla.PedTal_CantidadProducida)
                        {
                            return "Estilo[" + estilo.DE_Estilo.Descripcion + "] - Color[" + color.TG_Combinacion.Combinacion_Descripcion + "] - Talla[" + talla.TG_Talla.Talla_DescripcionCorta + "] Cantidad Producida excede en 10% mas de la Cantidad Solicitada.";
                        }
                    }
                }
            }

            return string.Empty;
        }

        protected void clienteSearch_Seleccionado(object sender, EventArgs e)
        {
            CargarDireccion();
        }


        protected void temporadaSearch_Seleccionado(object sender, EventArgs e)
        {
            if (this.estiloAdd.TemporadaId != this.temporadaSearch.CodigoSeleccionado)
            {
                this.estiloAdd.TemporadaId = this.temporadaSearch.CodigoSeleccionado;
                EstilosTemp = new List<CO_PedidoEstilo>();
                ColoresTemp = new List<CO_PedidoColor>();
                TallasTemp = new List<CO_PedidoTalla>();
                CargarEstilos();
                CargarColores();
                CargarTallas();
            }
        }

        private void CargarDireccion()
        {
            TablasDataContext db = new TablasDataContext();
            var listado = from direccion in db.TG_ClienteDireccion
                          where direccion.ClienteId == this.clienteSearch.CodigoSeleccionado
                          select direccion;

            this.ddlDireccion.DataSource = listado;
            this.ddlDireccion.DataTextField = "Descripcion";
            this.ddlDireccion.DataValueField = "Id";
            this.ddlDireccion.DataBind();

            ddlDireccion.Enabled = listado.Count() > 0;
        }

        private void CargarMonedas()
        {
            TablasDataContext db = new TablasDataContext();
            var listado = from monedas in db.TG_Moneda
                          select monedas;

            this.ddlMoneda.DataSource = listado;
            this.ddlMoneda.DataValueField = "Moneda_Id";
            this.ddlMoneda.DataTextField = "Moneda_DescripcionCorta";
            this.ddlMoneda.DataBind();
        }

        protected void gvEstilos_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected void gvEstilos_SelectedIndexChanged(object sender, EventArgs e)
        {            
            this.EstiloId = (int)gvEstilos.DataKeys[gvEstilos.SelectedIndex]["Estilo_Id"];
            var colores = ColoresTemp.FindAll(c => c.Estilo_Id == this.EstiloId);
            if (colores.Count > 0)
                this.ColorId = colores[0].Combinacion_Id;
            else
                this.ColorId = -1;
            CargarColores();
            ActualizarSeleccionGrilla(gvEstilos);

            var tallas = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);
            if (tallas.Count > 0)
                this.TallaId = tallas[0].Talla_Id;
            else
                this.TallaId = -1;
            CargarTallas();
            ActualizarSeleccionGrilla(gvTallas);

            combinacionAdd.EstiloId = this.EstiloId;
            estiloTallaAdd.EstiloId = this.EstiloId;
        }

        private void ActualizarSeleccionGrilla(GridView gv)
        {
            if (gv.SelectedIndex > -1)
                foreach (GridViewRow row in gv.Rows)
                {
                    if (row.Cells[0].Controls.Count > 0)
                    {
                        ImageButton img = (ImageButton)row.Cells[0].Controls[0];
                        if ((row.RowIndex == gv.SelectedIndex))
                        {
                            img.ImageUrl = @"~/images/selected.png";
                        }
                        else
                        {
                            img.ImageUrl = @"~/images/unselected.png";
                        }
                    }
                }
        }

        protected void btnEstiloAdicionar_Click(object sender, EventArgs e)
        {
            if (clienteSearch.CodigoSeleccionado == 0)
            {
                warningMessage.Visible = true;
                lblWarningMessage.Text = "Seleccione un Cliente";
                return;
            }

            if (temporadaSearch.CodigoSeleccionado == 0)
            {
                warningMessage.Visible = true;
                lblWarningMessage.Text = "Seleccione una Temporada";
                return;
            }
            estiloAdd.ListarEstilos();
        }

        protected void btnEstiloEliminar_Click(object sender, EventArgs e)
        {
            if (gvEstilos.SelectedIndex > -1)
            {
                this.EstiloId = (int)gvEstilos.DataKeys[gvEstilos.SelectedIndex]["Estilo_Id"];
                if (this.EstiloId > 0)
                {
                    var estilo = EstilosTemp.Find(c => c.Estilo_Id == this.EstiloId);
                    EstilosTemp.Remove(estilo);
                    ColoresTemp.RemoveAll(c => c.Estilo_Id == this.EstiloId);
                    TallasTemp.RemoveAll(c => c.Estilo_Id == this.EstiloId);
                    CargarEstilos();

                    if (EstilosTemp.Count > 0)
                    {
                        gvEstilos.SelectedIndex = 0;
                        this.EstiloId = (int)gvEstilos.DataKeys[gvEstilos.SelectedIndex]["Estilo_Id"];
                        ActualizarSeleccionGrilla(gvEstilos);

                        var colores = ColoresTemp.FindAll(c => c.Estilo_Id == this.EstiloId);

                        if (colores.Count > 0)
                        {
                            gvColores.SelectedIndex = 0;
                            this.ColorId = colores[0].Combinacion_Id;
                            CargarColores();
                            ActualizarSeleccionGrilla(gvColores);

                            var tallas = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);
                            if (tallas.Count > 0)
                            {
                                gvTallas.SelectedIndex = 0;
                                this.TallaId = tallas[0].Talla_Id;
                                CargarTallas();
                                ActualizarSeleccionGrilla(gvColores);
                            }
                            else
                            {
                                gvTallas.SelectedIndex = -1;
                                CargarTallas();
                            }
                        }
                        else
                        {
                            gvColores.SelectedIndex = -1;
                            gvTallas.SelectedIndex = -1;
                            CargarColores();
                            CargarTallas();
                        }
                    }
                    else
                    {
                        gvEstilos.SelectedIndex = -1;
                        gvColores.SelectedIndex = -1;
                        gvTallas.SelectedIndex = -1;
                        CargarColores();
                        CargarTallas();
                    }
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
        }


        protected void agregarEstilo_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var estilo = database.DE_Estilo.First(c => c.Id== estiloAdd.CodigoSeleccionado);
            
            //Si es el mismo cliente se toma por default el codigo.
            string codigoCliente = estilo.Cliente_Id == clienteSearch.CodigoSeleccionado ? estilo.CodigoCliente : string.Empty;

            if (!EstilosTemp.Exists(c => c.Estilo_Id == estiloAdd.CodigoSeleccionado))
            {
                CO_PedidoEstilo pedidoEstilo = new CO_PedidoEstilo()
                {
                    Estilo_Id = estilo.Id,                    
                    DE_Estilo = estilo,
                    PedEst_CodigoCliente = codigoCliente
                };
                
                EstilosTemp.Add(pedidoEstilo);
                if (EstilosTemp.Count() == 1) this.EstiloId = EstilosTemp[0].Estilo_Id;
                CargarEstilos();
            }
            CargarColores();
            ActualizarSeleccionGrilla(gvColores);
            CargarTallas();
            ActualizarSeleccionGrilla(gvTallas);

            combinacionAdd.EstiloId = this.EstiloId;
            estiloTallaAdd.EstiloId = this.EstiloId;
        }

        private void ListarEstilos()
        {
            TablasDataContext database = new TablasDataContext();

            var listaEstilos = from estilos in database.CO_PedidoEstilo
                               where estilos.PedCom_Id == this.PedidoCompraId
                                select estilos;

            EstilosTemp = listaEstilos.ToList();
        }

        private void CargarEstilos()
        {
            if (EstilosTemp.Count() > 0)
            {
                gvEstilos.DataSource = EstilosTemp;
                gvEstilos.DataBind();
                if (this.EstiloId > 0)
                    gvEstilos.SelectedIndex = EstilosTemp.IndexOf(EstilosTemp.Find(c => c.Estilo_Id == this.EstiloId));
                else
                    gvEstilos.SelectedIndex = 0;
                ActualizarSeleccionGrilla(gvEstilos);
            }
            else
            {
                gvEstilos.DataSource = new List<CO_PedidoEstilo>() { new CO_PedidoEstilo() };
                gvEstilos.DataBind();
                gvEstilos.SelectedIndex = -1;
                for (int i = 0; i < gvEstilos.Rows[0].Cells.Count; i++)
                {
                    gvEstilos.Rows[0].Cells[i].Text = "&nbsp;";
                }                
            }
        }


        [WebMethod]
        public static void actualizarEstiloCliente(int id, string estiloCliente)
        {
            if (!string.IsNullOrEmpty(estiloCliente))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var estilos = (List<Emporium_Web.DBML.CO_PedidoEstilo>)pagina.Session["EstilosTemp"];

                var estilo = estilos.Find(c => c.Estilo_Id == id);
                estilo.PedEst_CodigoCliente = estiloCliente;
            }
        }

        

        protected void gvColores_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected void gvColores_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ColorId = (int)gvColores.DataKeys[gvColores.SelectedIndex]["Combinacion_Id"];            
            ActualizarSeleccionGrilla(gvColores);

            var tallas = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);
            if (tallas.Count > 0)
                this.TallaId = tallas[0].Talla_Id;
            else
                this.TallaId = -1;
            CargarTallas();
            ActualizarSeleccionGrilla(gvTallas);

            combinacionAdd.EstiloId = this.EstiloId;
            estiloTallaAdd.EstiloId = this.EstiloId;
        }

        protected void btnColorAdicionar_Click(object sender, EventArgs e)
        {
            combinacionAdd.ListarCombinaciones();
        }

        protected void btnColorEliminar_Click(object sender, EventArgs e)
        {
            if (gvColores.SelectedIndex > -1)
            {
                this.ColorId = (int)gvColores.DataKeys[gvColores.SelectedIndex]["Combinacion_Id"];
                if (this.ColorId > 0)
                {
                    var color = ColoresTemp.Find(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);
                    ColoresTemp.Remove(color);
                    TallasTemp.RemoveAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);                    
                    
                    CargarColores();

                    if (ColoresTemp.Count > 0)
                    {
                        gvColores.SelectedIndex = 0;
                        this.ColorId = (int)gvColores.DataKeys[gvColores.SelectedIndex]["Combinacion_Id"];
                        ActualizarSeleccionGrilla(gvColores);

                        var tallas = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);

                        if (tallas.Count > 0)
                        {
                            gvTallas.SelectedIndex = 0;
                            this.TallaId = (int)gvTallas.DataKeys[gvTallas.SelectedIndex]["Talla_Id"];
                            CargarTallas();
                            ActualizarSeleccionGrilla(gvTallas);
                        }
                        else
                        {
                            gvTallas.SelectedIndex = -1;
                            CargarTallas();
                        }
                    }
                    else
                    {
                        gvColores.SelectedIndex = -1;
                        gvTallas.SelectedIndex = -1;
                        CargarTallas();
                    }
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
        }

        protected void agregarColor_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var combinacion = database.TG_Combinacion.First(c => c.Combinacion_Id == combinacionAdd.CodigoSeleccionado);

            if (!ColoresTemp.Exists(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == combinacionAdd.CodigoSeleccionado))
            {
                CO_PedidoColor pedidoColor = new CO_PedidoColor()
                {
                    Estilo_Id = this.EstiloId,
                    Combinacion_Id = combinacion.Combinacion_Id,
                    TG_Combinacion = combinacion
                };
                var colores = ColoresTemp.FindAll(c => c.Estilo_Id == this.EstiloId);
                if (colores.Count == 0) this.ColorId = combinacion.Combinacion_Id;
                ColoresTemp.Add(pedidoColor);
                CargarColores();
            }           
            CargarTallas();
            ActualizarSeleccionGrilla(gvTallas);
        }

        private void ListarColores()
        {
            TablasDataContext database = new TablasDataContext();

            var listaColores = from colores in database.CO_PedidoColor
                               where colores.PedCom_Id == this.PedidoCompraId
                               select colores;

            ColoresTemp = listaColores.ToList();
        }

        private void CargarColores()
        {
            var colores = ColoresTemp.FindAll(c => c.Estilo_Id == this.EstiloId);
            if (colores.Count > 0)
            {  
                gvColores.DataSource = colores;
                gvColores.DataBind();
                if (this.ColorId > 0)
                    gvColores.SelectedIndex = colores.IndexOf(colores.Find(c => c.Combinacion_Id == this.ColorId));
                else
                    gvColores.SelectedIndex = 0;
                ActualizarSeleccionGrilla(gvColores);
            }
            else
            {
                gvColores.DataSource = new List<CO_PedidoColor>() { new CO_PedidoColor() };
                gvColores.DataBind();
                gvColores.SelectedIndex = -1;
                for (int i = 0; i < gvColores.Rows[0].Cells.Count; i++)
                {
                    gvColores.Rows[0].Cells[i].Text = "&nbsp;";
                }               
            }
        }

        [WebMethod]
        public static void actualizarColorCliente(int id, string colorCliente)
        {
            if (!string.IsNullOrEmpty(colorCliente))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var colores = (List<Emporium_Web.DBML.CO_PedidoColor>)pagina.Session["ColoresTemp"];

                var color = colores.Find(c => c.Combinacion_Id == id && c.Estilo_Id == pagina.EstiloId);
                color.PedCol_CodigoCliente = colorCliente;
            }
        }

        [WebMethod]
        public static void actualizarPrecioColor(int id, string precioColor)
        {
            if (!string.IsNullOrEmpty(precioColor))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var colores = (List<Emporium_Web.DBML.CO_PedidoColor>)pagina.Session["ColoresTemp"];

                var color = colores.Find(c => c.Combinacion_Id == id && c.Estilo_Id == pagina.EstiloId);
                color.PedCol_Precio = Convert.ToDecimal(precioColor);
            }
        }

        protected void gvTallas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            
        }

        protected void gvTallas_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.TallaId = (int)gvTallas.DataKeys[gvTallas.SelectedIndex]["Talla_Id"];
            ActualizarSeleccionGrilla(gvTallas);
        }

        protected void btnTallaAgregar_Click(object sender, EventArgs e)
        {
            estiloTallaAdd.ListarEstiloTallas();
        }

        protected void btnTallaEliminar_Click(object sender, EventArgs e)
        {
            if (gvTallas.SelectedIndex > -1)
            {
                this.TallaId = (int)gvTallas.DataKeys[gvTallas.SelectedIndex]["Talla_Id"];
                if (this.TallaId > 0)
                {
                    var talla = TallasTemp.Find(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId && c.Talla_Id == this.TallaId);
                    TallasTemp.Remove(talla);
                    CargarTallas();

                    if (TallasTemp.Count > 0)
                    {
                        gvTallas.SelectedIndex = 0;
                        this.TallaId = (int)gvTallas.DataKeys[gvColores.SelectedIndex]["Talla_Id"];
                        ActualizarSeleccionGrilla(gvTallas);
                    }
                    else
                    {
                        gvTallas.SelectedIndex = -1;
                    }
                }
                else
                {
                    warningMessage.Visible = true;
                    lblWarningMessage.Text = Resources.MensajesValidacion.NoItemSelected;
                }
            }
        }

        protected void agregarTalla_Click(object sender, EventArgs e)
        {
            TablasDataContext database = new TablasDataContext();

            var talla = database.TG_Talla.First(c => c.Talla_Id == estiloTallaAdd.CodigoSeleccionado);
            var color = ColoresTemp.Find(c=>c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);

            if (!TallasTemp.Exists(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId && c.Talla_Id == estiloTallaAdd.CodigoSeleccionado))
            {
                CO_PedidoTalla pedidoTalla = new CO_PedidoTalla()
                {
                    Estilo_Id = this.EstiloId,
                    Combinacion_Id = this.ColorId,      
                    Talla_Id = talla.Talla_Id,
                    TG_Talla = talla,
                    PedTal_Precio = color.PedCol_Precio
                };
                var tallas = TallasTemp.FindAll(c => c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);
                if (tallas.Count == 0) this.TallaId = talla.Talla_Id;
                TallasTemp.Add(pedidoTalla);
                CargarTallas();
            }
        }

        private void ListarTallas()
        {
            TablasDataContext database = new TablasDataContext();

            var listaTallas = from tallas in database.CO_PedidoTalla
                               where tallas.CO_PedidoColor.PedCom_Id == this.PedidoCompraId
                               select tallas;

            TallasTemp = listaTallas.ToList();
        }

        private void CargarTallas()
        {
            var tallas = TallasTemp.FindAll(c=> c.Estilo_Id == this.EstiloId && c.Combinacion_Id == this.ColorId);

            if (tallas.Count > 0)
            {
                gvTallas.DataSource = tallas;
                gvTallas.DataBind();
                if (this.TallaId > 0)
                    gvTallas.SelectedIndex = TallasTemp.IndexOf(TallasTemp.Find(c => c.Talla_Id == this.TallaId));
                else
                    gvTallas.SelectedIndex = 0;
                ActualizarSeleccionGrilla(gvTallas);
            }
            else
            {
                gvTallas.DataSource = new List<CO_PedidoTalla>() { new CO_PedidoTalla() };
                gvTallas.DataBind();
                gvTallas.SelectedIndex = -1;
                for (int i = 0; i < gvTallas.Rows[0].Cells.Count; i++)
                {
                    gvTallas.Rows[0].Cells[i].Text = "&nbsp;";
               }               
            }
        }

        [WebMethod]
        public static void actualizarCantidadSolicitada(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var tallas = (List<Emporium_Web.DBML.CO_PedidoTalla>)pagina.Session["TallasTemp"];

                var talla = tallas.Find(c => c.Talla_Id == id && c.Estilo_Id == pagina.EstiloId && c.Combinacion_Id == pagina.ColorId);
                talla.PedTal_CantidadSolicitada = Convert.ToInt32(cantidad);
            }
        }

        [WebMethod]
        public static void actualizarCantidadProducir(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var tallas = (List<Emporium_Web.DBML.CO_PedidoTalla>)pagina.Session["TallasTemp"];

                var talla = tallas.Find(c => c.Talla_Id == id && c.Estilo_Id == pagina.EstiloId && c.Combinacion_Id == pagina.ColorId);
                talla.PedTal_CantidadProducida = Convert.ToInt32(cantidad);
            }
        }

        [WebMethod]
        public static void actualizarPrecioTalla(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                PedidosCompraForm pagina = new PedidosCompraForm();
                var tallas = (List<Emporium_Web.DBML.CO_PedidoTalla>)pagina.Session["TallasTemp"];

                var talla = tallas.Find(c => c.Talla_Id == id && c.Estilo_Id == pagina.EstiloId && c.Combinacion_Id == pagina.ColorId);
                talla.PedTal_Precio = Convert.ToDecimal(cantidad);
            }
        }

           

    }
}